package com.xiangge.homework;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Test {
    public static void main10(String[] args) {
        /*我国最高山峰是珠穆朗玛峰8848米；
          现在有一张足够大的纸，厚度是0.01米
          请问要折多少次才能到珠穆朗玛峰高度*/
        // 定义一个统计数
        int count = 0;
        double num = 0.01;
        // 不清楚要进行多少次的折叠，使用死循环
        while (num < 8848){
            num = num * 2;
            count++;
        }
        System.out.println(count);
    }
    public static void main9(String[] args) {
        /*求水仙花数（一个三位数，个十百位每位的立方和等于该数本身）*/
        // 循环遍历三位数
        for (int i = 100; i < 1000; i++) {
            // 分别获取每个位数
            int g = i % 10;
            int s = i / 10 % 10;
            int b = i / 100 % 10;
            // 判断是否为水仙花数
            if (i == Math.pow(g,3) + Math.pow(s,3) + Math.pow(b,3)){
                System.out.println(i + "是水仙花数");
            }
        }
    }
    public static void main8(String[] args) {
        /*随机一个5位数的整数，打印这个整数，再将这个5位数的个位与万位调换，十位与千位调换，打印出新的数*/
        // 随机生成一个5位数
        int num = new Random().nextInt(90000) + 10000;
        System.out.println(num);
        // 分别获取每个位数
        int g = num % 10;
        int s = num / 10 % 10;
        int b = num / 100 % 10;
        int q = num / 1000 % 10;
        int w = num / 10000 % 10;
        // 分别将个位与万位调换，十位与千位调换
        int g2 = g * 10000;
        int s2 = s * 1000;
        // 最后组合成新的数
        int sum = g2 + s2 + b*100 + q*10 + w;
        System.out.println(sum);
    }
    public static void main7(String[] args) {
        /*一球从100米高度自由落下，每次落地后返回原来高度的一半
          再落下，求它在第十次落地时进过多少米，返回多少米*/
        // 定义小球的所在高度为h
        double h = 100.0;
        double sum = 0;
        // 要连续进行10次自由落体，那么就循环十次循环体
        for (int i = 1; i <= 10; i++) {
            h = h / 2;
            sum += h;
        }
        System.out.println("第十次后小球返回" + h + "米" + "\n" + "第十次后小球总共走了" + sum + "米");
    }
    public static void main6(String[] args) {
        /*用户输入3个整数，将这三个整数从小到大打印出来*/
        // 录入用户输入的整数
        System.out.println("请用户输入第1个数：");
        int num1 = new Scanner(System.in).nextInt();
        System.out.println("请用户输入第2个数：");
        int num2 = new Scanner(System.in).nextInt();
        System.out.println("请用户输入第3个数：");
        int num3 = new Scanner(System.in).nextInt();
        // 将这三个数放入数组中，使用排序从大到小排序
        int[] arr = {num1,num2,num3};
        for (int i = 1; i < arr.length; i++) {
            // 假设数组中的第一个元素就是最大值，而它的索引也就是0
            int max = arr[i - 1];
            int maxIndex = i - 1;
            for (int j = i-1; j < arr.length; j++) {
                // 进行大小判断
                if (max < arr[j]){
                    max = arr[j];
                    maxIndex = j;
                }
            }
            // 然后进行元素交换
            int temp = arr[maxIndex];
            arr[maxIndex] = arr[i-1];
            arr[i-1] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }
    public static void main5(String[] args) {
        /*随机一个100到200之间的整数x,然后再让用户输入一个10以内的整数y，判断x是否是y的倍数*/
        // 随机得到一个范围在100-200之间的整数
        int x = new Random().nextInt(101) + 100;
        // 用户输入一个范围在10以内的整数
        System.out.println("请输入一个符合范围的整数：");
        int y = new Scanner(System.in).nextInt();
        // 对用户输入的整数进行判断
        if (y < 0 || y >10){
            System.err.println("用户输入不合法");
            return;
        }
        // 在所有前置条件都合规后，进行判断
        if (x % y == 0){
            System.out.println("x是y的倍数");
        }else {
            System.out.println("x不是y的倍数");
        }
        // 输出随机生成的数字
        System.out.println("随机生成的数字:" + x);
    }
    public static void main4(String[] args) {
        /*计算1-100之间的质数有多少个？*/
        // 要计算质数的个数，需要定义统计，同时将范围内的所有数进行比较
        int count = 0;
        for (int i = 2;i <= 100;i++){
            boolean flag = true;
            // 再次进行循环
            for (int j = 2; j < i - 1; j++) {
                // 进行质数判断
                if (i % j == 0){
                    flag = false;
                    break;
                }
            }
            // 根据布尔值来判断是不是质数
            if (flag == true) {
                count++;
                System.out.println(i + "是质数");
            }
        }
        System.out.println("质数的个数为：" + count);
    }
    public static void main3(String[] args) {
        /*将"我","爱","你"存入数组，然后正着反着输出*/
        // 定义一个String类型的数组
        String[] arr = {"我","爱","你"};
        // 正着输出
        for (String yuanSu : arr) {
            System.out.print(yuanSu);
        }
        // 将数组进行交换
        for (int i = 0 ,j = arr.length-1; i <= j; i++, j--) {
            String  temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        // 将上一次输出与这次分隔开
        System.out.println();
        // 同样强制输出数组
        for (String yuanSu2 : arr) {
            System.out.print(yuanSu2);
        }
    }
    public static void main2(String[] args) {
        /*有数组int[] a = {4,7,3,4,5,1,9,8，11,12,6,18,10,2};
          清编写代码实现该数组从小到大排序，且输出数组12的索引(二分法)*/
        // 定义一个数组
        int[] a = {4,7,3,4,5,1,9,8,11,12,6,18,10,2};
        // 这里选择使用选择排序的方法来完成数组的从小到大排序
        // 首先使用for循环来代表交换的次数
        for (int i = 1; i < a.length; i++) {
            // 假设数组中的第一个元素就是最小值，而它的索引也就是0
            int min = a[i - 1];
            int minIndex = i - 1;
            // 使用for循环遍历数组，然后进行元素比对
            // 因为每一轮排序后都会在数组的最前端定位一个最小值，
            // 所以在下次轮数开始时可以直接从上一轮定位后的下一个位置开始也就是i-1
            for (int j = i-1; j < a.length; j++) {
                if (min > a[j]){
                    min = a[j];
                    minIndex = j;
                }
            }
            // 然后进行元素交换
            int temp = a[minIndex];
            a[minIndex] = a[i-1];
            a[i-1] = temp;
        }
        // 最后使用Array工具查看数组
        System.out.println(Arrays.toString(a));
        // 使用二分查找方法找到数组12的索引
        int n = 12;
        // 定义最大，最小和中间索引
        int max = a.length-1;
        int min = 0;
        int mid ;
        // 使用while循环来实现
        while (min <= max){
            mid = (max + min)/2;
            if (n < a[mid]){
                max = mid - 1;
            }else if (n > a[mid]){
                min = mid + 1;
            }else {
                System.out.println("元素12的索引为：" + mid);
                return;
            }
        }
        System.err.println("元素12不在数组中");
    }
    public static void main1(String[] args) {
        /*有一个整数数组，存储了1，3,5,7,9,11,13,15,17,19；将该数组倒序存储并输出*/
        // 定义一个数组
        int[] arr = {1,3,5,7,9,11,13,15,17,19};
        // 定义一个int类型的临时变量，用来进行数组元素的交换
        int temp = 0;
        // 遍历数组，然后将数组元素进行交换
        // 创建两个指针，分别从前后开始移动，让代表的元素进行交换
        for (int i = 0,j = arr.length-1; i <= j; i++,j--) {
            // 让两个指针的元素在临时变量的辅助下进行交换
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        // 使用Array工具查看倒序后的数组
        System.out.println(Arrays.toString(arr));
    }
}
